from mcp.server.fastmcp import FastMCP, Context
import subprocess
import json
from typing import List, Optional

mcp = FastMCP("Java-11-OpenJDK MCP Server")

"""
面向软件：java-11-openjdk

所有 MCP tool 列表：

1. java_version
   - 用途：获取 Java 运行时版本信息
   - 参数：无
   - 返回结构：统一 JSON 结构

2. java_compile
   - 用途：编译 Java 源文件
   - 参数：source_files (Java 源文件路径列表)
   - 返回结构：统一 JSON 结构

3. java_execute
   - 用途：运行 Java 类文件
   - 参数：class_name (要执行的类名), classpath (可选类路径)
   - 返回结构：统一 JSON 结构

4. javac_version
   - 用途：获取 Java 编译器版本信息
   - 参数：无
   - 返回结构：统一 JSON 结构
"""

@mcp.tool()
def java_version() -> dict:
    """
    获取 Java 运行时版本信息
    
    返回：
        dict: 包含执行结果的统一 JSON 结构
        {
            "success": bool,      # 是否执行成功
            "command": str,       # 执行的命令
            "exit_code": int,     # 退出码
            "stdout": str,        # 标准输出
            "stderr": str         # 标准错误
        }
    """
    command = ["java", "-version"]
    result = subprocess.run(command, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": " ".join(command),
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

@mcp.tool()
def java_compile(source_files: List[str]) -> dict:
    """
    编译 Java 源文件
    
    参数：
        source_files: List[str] - 要编译的 Java 源文件路径列表
    
    返回：
        dict: 包含执行结果的统一 JSON 结构
        {
            "success": bool,      # 是否执行成功
            "command": str,       # 执行的命令
            "exit_code": int,     # 退出码
            "stdout": str,        # 标准输出
            "stderr": str         # 标准错误
        }
    """
    if not source_files:
        return {
            "success": False,
            "command": "javac",
            "exit_code": 1,
            "stdout": "",
            "stderr": "错误：未提供源文件"
        }
    
    command = ["javac"] + source_files
    result = subprocess.run(command, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": " ".join(command),
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

@mcp.tool()
def java_execute(class_name: str, classpath: Optional[str] = None) -> dict:
    """
    运行 Java 类文件
    
    参数：
        class_name: str - 要执行的类名
        classpath: Optional[str] - 可选的类路径
    
    返回：
        dict: 包含执行结果的统一 JSON 结构
        {
            "success": bool,      # 是否执行成功
            "command": str,       # 执行的命令
            "exit_code": int,     # 退出码
            "stdout": str,        # 标准输出
            "stderr": str         # 标准错误
        }
    """
    command = ["java"]
    if classpath:
        command.extend(["-cp", classpath])
    command.append(class_name)
    
    result = subprocess.run(command, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": " ".join(command),
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

@mcp.tool()
def javac_version() -> dict:
    """
    获取 Java 编译器版本信息
    
    返回：
        dict: 包含执行结果的统一 JSON 结构
        {
            "success": bool,      # 是否执行成功
            "command": str,       # 执行的命令
            "exit_code": int,     # 退出码
            "stdout": str,        # 标准输出
            "stderr": str         # 标准错误
        }
    """
    command = ["javac", "-version"]
    result = subprocess.run(command, capture_output=True, text=True)
    
    return {
        "success": result.returncode == 0,
        "command": " ".join(command),
        "exit_code": result.returncode,
        "stdout": result.stdout,
        "stderr": result.stderr
    }

if __name__ == "__main__":
    mcp.run()